package com.openatc.agent.service.impl;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.openatc.agent.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * @Classname CommService
 * @Description 抽取controller层公用的方法
 * @Date 2022/12/20 14:14
 * @Created by kedacom
 */
@Service
public class CommonService {

    @Autowired
    private CommServiceDown commServiceDown;

    /**
     * 根据查询条件中的组织机构，构建组织机构查询条件
     * @param orgCode
     * @return
     */
    public String buildOrgCondition(String orgCode) {
        User user = commServiceDown.getUserInfo();
        String user_orgCode = user.getOrganization();
        String orgCondition = "";
        if (StringUtils.hasLength(orgCode)) {
            // 管理员/查询所有组织机构("*")，不添加组织机构条件
            if (commServiceDown.isAdminRole(user.getRoleNames())) {
                if (!"*".equals(orgCode)) {
                    orgCondition = String.format("code='%s'",orgCode);
                }
            }
            // 非管理员
            else {
                // 用户组织机构为*
                if ("*".equals(user_orgCode)) {
//                        查询的组织机构不为"*"
                    if (!"*".equals(orgCode)) {
                        orgCondition = String.format("code='%s'",orgCode);
                    }
                }
                // 用户组织机构不为*
                else {
                    // 查询的组织机构为*，把用户组织机构当作条件
                    if ("*".equals(orgCode)) {
                        orgCondition = String.format("code='%s'",user_orgCode);
                    } else {
                        // 用户不属于查询条件中的组织机构，要返回空数据
                        if (!user_orgCode.equals(orgCode)){
                            // 添加一个恒假条件,保证返回空数据
                            orgCondition = "1=2";
                        }
                        // 查询条件中的组织机构和用户所属组织机构一致，再添组织机构条件
                        else {
                            orgCondition = String.format("code='%s'",orgCode);
                        }
                    }
                }
            }
        } else {
            // 普通用户，默认把当前用户的组织机构作为条件
            if (!commServiceDown.isAdminRole(user.getRoleNames())) {
                orgCondition = String.format("code='%s'",user_orgCode);
            }
        }
        return orgCondition;
    }

    /**
     * 添加where和and
     * @param whereCondition
     * @param temp
     * @return
     */
    public String addWhereCondition(String whereCondition, String temp) {
        if(whereCondition == null)
            whereCondition = "";

        if (!StringUtils.hasLength(temp)) {
            return whereCondition;
        }

        if(whereCondition.isEmpty()) {
            whereCondition = whereCondition.concat(" where ");
        }
        else{
            whereCondition = whereCondition.concat(" and ");
        }
        whereCondition = whereCondition.concat(temp);

        return  whereCondition;
    }

    /**
     * 校验请求参数
     * @param requestData
     * @param params
     */
    public void verifyParam(JsonObject requestData, String... params) {
        if (params == null || params.length == 0) {
            return;
        }
        for (String param : params) {
            JsonElement paramElement = requestData.get(param);
            if (paramElement == null) {
                throw new IllegalArgumentException(param);
            }
        }
    }

    /**
     * 是否有模糊查询过滤条件
     * @param requestData
     * @return
     */
    public boolean hasSearchCondition(JsonObject requestData) {
        return hasSpecialValue(requestData,"search") && (!"".equals(requestData.get("search").getAsString()));
    }

    /**
     * 是否存在组织机构过滤条件
     * @param requestData
     * @return
     */
    public boolean hasOrgCondition(JsonObject requestData) {
        return hasSpecialValue(requestData,"code") && (!"".equals(requestData.get("code").getAsString()));
    }

    /**
     * 是否存在指定得字段
     * @return
     */
    private boolean hasSpecialValue(JsonObject requestData,String key) {
        return requestData.get(key) != null;
    }
}
